﻿#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;

//using namespace std;
//class Goods{
//public:
//	string _name;  //名字
//	double _price; // 价格
//	int _evaluate; // 评价
//	Goods(const char* str, double price, int evaluate)
//		:_name(str)
//		, _price(price)
//		, _evaluate(evaluate)
//	{}
//};
//class Compare_price{
//public:
//	bool operator()(const Goods& g1, const Goods g2){
//		return g1._price < g2._price;
//	}
//};
// 
//int main()
//{
//	vector<Goods> vG = { {"足球", 100, 10}, {"篮球", 99, 9}, {"羽毛球", 110, 11} };
//	function<bool(const Goods, const Goods)> func1 = [](Goods g1, Goods g2)-> bool {return g1._evaluate > g2._evaluate; };
//	function<bool(const Goods, const Goods)> func2 = Compare_price();
//	sort(vG.begin(), vG.end(), func1);
//	return 0;
//}

//表示绑定函数plus 参数分别由调用 func1 的第一，二个参数指定
//std::function<int(int, int)> func1 = std::bind(Plus, placeholders::_1,
//	placeholders::_2);
//auto func1 = std::bind(Plus, placeholders::_1, placeholders::_2);
//func2的类型为 function<void(int, int, int)> 与func1类型一样
//表示绑定函数 plus 的第一，二为： 1， 2
//int main()
//{
//
//	auto  func2 = std::bind(Plus, 1, 2);
//	cout << func1(1, 2) << endl;
//	cout << func2() << endl;
//	Sub s;
//	// 绑定成员函数
//	std::function<int(int, int)> func3 = std::bind(&Sub::sub, s,
//		placeholders::_1, placeholders::_2);
//	// 参数调换顺序
//	std::function<int(int, int)> func4 = std::bind(&Sub::sub, s,
//		placeholders::_2, placeholders::_1);
//	cout << func3(1, 2) << endl;
//	cout << func4(1, 2) << endl;
//	return 0;
//}
// 

int Plus(int a, int b){
	return a + b;
}
class Sub{
public:
	int sub(int a, int b){
		return a - b;
	}
};
int main()
{
	//function<int(int, int)> func1 = bind(Plus, placeholders::_2, placeholders::_1); // bind 普通函数，并将第二个参数与第一个参数交换位置
	//cout << func1(1, 9);
	//// bind 成员 函数，并保持参数位置不变
	//function<int(int,int)> func2 = bind(&Sub::sub, Sub()/*这里必须传一个对象*/, placeholders::_1, placeholders::_2); 
	//cout << " " << func2(9, 1) << endl;
	// placeholders::_n , n 代表函数传递的第 n 个参数
	function<int(int, int)> func3 = bind(&Sub::sub, Sub()/*这里必须传一个对象*/, 20, placeholders::_1); // 20 - 90
	function<int(int, int)> func4 = bind(&Sub::sub, Sub()/*这里必须传一个对象*/, 20, placeholders::_2); // 20 - 10
	cout << func3(90, 10) << endl;
	cout << func4(90, 10) << endl;
	return 0;
}